<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="Bw5g8" id="Bw5g8"><span data-lake-id="ueca60c55" id="ueca60c55">典型回答</span></h1>
  <p data-lake-id="u3c24dfc6" id="u3c24dfc6"><br></p>
  <p data-lake-id="ub21daf3d" id="ub21daf3d"><span data-lake-id="u0c3b7f4a" id="u0c3b7f4a">随机数在计算机应用中使用的比较广泛，最为熟知的便是在通信安全和现代密码学等领域中的应用。</span></p>
  <p data-lake-id="u17508db8" id="u17508db8"><span data-lake-id="ue871e62b" id="ue871e62b">​</span><br></p>
  <p data-lake-id="uc4b9f8cf" id="uc4b9f8cf"><span data-lake-id="uf523cd89" id="uf523cd89">随机数分为真随机数和伪随机数，</span><strong><span data-lake-id="u5e969d23" id="u5e969d23">我们程序中使用的基本都是伪随机数。</span></strong></p>
  <ul list="u47bb26d4">
   <li fid="u7aa28119" data-lake-id="ub70b53d3" id="ub70b53d3" data-lake-index-type="true"><span data-lake-id="u2ce6c1a6" id="u2ce6c1a6">真随机数，通过物理实验得出，比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等。</span><strong><span data-lake-id="u117d821b" id="u117d821b">需要满足随机性、不可预测性、不可重现性。</span></strong></li>
   <li fid="u7aa28119" data-lake-id="u5144964c" id="u5144964c" data-lake-index-type="true"><span data-lake-id="ud745617f" id="ud745617f">伪随机数，通过一定算法和种子得出。软件实现的是伪随机数。</span></li>
  </ul>
  <p data-lake-id="u4042f040" id="u4042f040"><span data-lake-id="u746ab2f5" id="u746ab2f5"><br></span><strong><span data-lake-id="u0a59dcf4" id="u0a59dcf4">只要这个随机数是由确定算法生成的，那就是伪随机。只能通过不断算法优化，使你的随机数更接近随机。</span></strong></p>
  <p data-lake-id="ud2481ac1" id="ud2481ac1"><span data-lake-id="u2695f668" id="u2695f668">​</span><br></p>
  <p data-lake-id="ua3a6772c" id="ua3a6772c"><span data-lake-id="uffa58eed" id="uffa58eed">有限状态机不能产生真正的随机数的。</span><strong><span data-lake-id="u9cd0a44b" id="u9cd0a44b">所以，现代计算机中，无法通过一个纯算法来生成真正的随机数。无论是哪种语言，单纯的算法生成的数字都是伪随机数，都是由可确定的函数通过一个种子，产生的伪随机数。</span></strong></p>
  <p data-lake-id="u21cb974a" id="u21cb974a"><strong><span data-lake-id="u48447b2c" id="u48447b2c">​</span></strong><br></p>
  <h1 data-lake-id="PpTEp" id="PpTEp"><span data-lake-id="uf46d0ea5" id="uf46d0ea5">扩展知识</span></h1>
  <p data-lake-id="ubf6475da" id="ubf6475da"><br></p>
  <h2 data-lake-id="HgLrD" id="HgLrD"><span data-lake-id="uf76a7e7d" id="uf76a7e7d">真随机</span></h2>
  <p data-lake-id="u9393b5e1" id="u9393b5e1"><br></p>
  <p data-lake-id="u21686af7" id="u21686af7"><strong><span data-lake-id="u175ebeb4" id="u175ebeb4">真正的随机数是使用物理现象产生而不是计算机程序产生的。生成随机数的设备我们称之为真随机数生成器。</span></strong></p>
  <p data-lake-id="uc37f4c37" id="uc37f4c37"><span data-lake-id="ud8c96672" id="ud8c96672">​</span><br></p>
  <p data-lake-id="u8d90b33b" id="u8d90b33b"><span data-lake-id="ubd59b39b" id="ubd59b39b">这样的设备通常是基于一些能生成低等级、统计学随机的“噪声”信号的微观现象，如热力学噪声、光电效应和量子现象。</span></p>
  <p data-lake-id="u4dd6d101" id="u4dd6d101"><span data-lake-id="u07c1599e" id="u07c1599e">​</span><br></p>
  <p data-lake-id="u1f9a3ff2" id="u1f9a3ff2"><span data-lake-id="u0778d1a4" id="u0778d1a4">从某种程度上来说，基于经典热噪声的随机数芯片读取当前物理环境中的噪声，并据此获得随机数。这类装置相对于基于软件算法的实现，由于环境中的变量更多，因此更难预测。</span></p>
  <p data-lake-id="uac148fa1" id="uac148fa1"><span data-lake-id="u3ee0239c" id="u3ee0239c">​</span><br></p>
  <p data-lake-id="u86605100" id="u86605100"><span data-lake-id="u6e59cc3c" id="u6e59cc3c">然而在牛顿力学的框架下，即使影响随机数产生的变量非常多，但在每个变量的初始状态确定后，整个系统的运行状态及输出在原理上是可以预测的，因此这一类装置也是基于确定性的过程，只是某种更难预测的伪随机数（pseudo random number）。</span></p>
  <p data-lake-id="ud52ccf46" id="ud52ccf46"><span data-lake-id="u959cef8e" id="u959cef8e">​</span><br></p>
  <p data-lake-id="u7fcf2bac" id="u7fcf2bac"><span data-lake-id="u8925ce80" id="u8925ce80">量子力学的发现从根本上改变了这一局面，因为其基本物理过程具有经典物理中所不具有的内禀随机性，从而可以制造出真正的随机数（true random number）产生器。</span></p>
  <p data-lake-id="ud929d0e8" id="ud929d0e8"><span data-lake-id="uf62ad5b5" id="uf62ad5b5">​</span><br></p>
  <p data-lake-id="ua45532ca" id="ua45532ca"><span data-lake-id="uc358dbef" id="uc358dbef">据美国国家标准与技术研究院（NIST）官网消息，该机构研究人员在2018年4月出版的《自然》杂志上撰文指出（原文地址：https://www.nature.com/articles/s41586-018-0019-0.epdf ），他们开发出一种新方法，可生成由量子力学保证的随机数字。新技术超越了此前获得随机数字的所有方法，得到了“真正的随机数字”，有助增强密码系统的安全性。</span></p>
  <p data-lake-id="u6b1a4734" id="u6b1a4734"><span data-lake-id="u71f0c101" id="u71f0c101">​</span><br></p>
  <p data-lake-id="ub849f983" id="ub849f983"><span data-lake-id="u2cab6844" id="u2cab6844">NIST数学家彼特·比尔霍斯特进一步解释说：“诸如翻转硬币之类的情况似乎是随机的，但如果能看到硬币确切的下落路径，最终结果也是可以预测的。因此，很难保证给定经典来源真正不可预测。量子力学在产生随机性方面表现更好，量子随机是真正的随机，因为对处于‘叠加’状态的量子粒子进行测量，得到的结果基本上是不可预测的。”</span></p>
  <p data-lake-id="u7881ebc6" id="u7881ebc6"><span data-lake-id="u5a5a968f" id="u5a5a968f">​</span><br></p>
  <p data-lake-id="u26d5b6a4" id="u26d5b6a4"><span data-lake-id="u6dc53ed7" id="u6dc53ed7">​</span><br></p>
  <h2 data-lake-id="jGsRk" id="jGsRk"><span data-lake-id="u6d558025" id="u6d558025">强随机数发生器</span></h2>
  <p data-lake-id="u846eb628" id="u846eb628"><br></p>
  <p data-lake-id="u0f2c4624" id="u0f2c4624"><span data-lake-id="u0cd7f991" id="u0cd7f991">强随机数发生器依赖于操作系统底层提供的随机事件。强随机数生成器的初始化速度和生成速度都较慢，而且由于需要一定的熵累积才能生成足够强度的随机数，所以可能会造成阻塞。熵累积通常来源于多个随机事件源，如敲击键盘的时间间隔，移动鼠标的距离与间隔，特定中断的时间间隔等。所以，只有在需要生成加密性强的随机数据的时候才用它。</span></p>
  <p data-lake-id="u2e000e82" id="u2e000e82"><span data-lake-id="ubcf21f02" id="ubcf21f02">​</span><br></p>
  <p data-lake-id="ufff4a283" id="ufff4a283"><span data-lake-id="u07b56f51" id="u07b56f51">Java提供的强随机数发生器是java.security.SecureRandom类，该类也是一个线程安全类，使用synchronize方法保证线程安全，但jdk并没有做出承诺在将来改变SecureRandom的线程安全性。因此，同Random一样，在高并发的多线程环境中可能会有性能问题。</span></p>
 </body>
</html>